package cn.lxycx.dataterrace.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 流式数据操作
 * @author 邢超
 * 时间：2019年7月24日
 */
public class DbStream {
	
	/**
	 * 查询一个大的数据列表
	 * @param sql
	 * @param de
	 * @param params
	 * @author XingChao
	 * @version 2019年7月24日
	 */
	public static void findList(String sql,DataExec de,Object ... params) {
		try {
			Connection con = Jdbc.getConn();
			PreparedStatement st = con.prepareStatement(sql);
			for(int i=0;i<params.length;i++) {
				Object o = params[i];
				st.setObject(i+1, o);
			}
			
			ResultSet rs = st.executeQuery();
			//异步执行
		 
		 	ResultSetMetaData md = rs.getMetaData();
		 	int colomn = md.getColumnCount();
		 	int len = 0;
			try {
				while(rs.next()) {
					Map<String,Object> map = new LinkedHashMap<String,Object>();
					//md = rs.getMetaData();
					for(int i=1;i<=colomn;i++) {
						String name = md.getColumnName(i);
						Object value = rs.getObject(i);
						map.put(name, value);
					}
					
					try {
						de.exec(map,++len);
					} catch (Exception e) {
						e.printStackTrace();
					}
					
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		 
		 
			st.close();
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

	
	/**
	 * DbStream内部接口
	 * @author XingChao
	 * @version 2019年7月24日
	 */
	public interface DataExec{
		
		/**
		 * 针对每条数据做处理
		 * @param map 单行数据
		 * @param index 第n条
		 * @author XingChao
		 * @version 2019年7月24日
		 */
		public void exec(Map<String,Object> map,int index) throws Exception;
	}
}


